//Hyra bil sid 34

#include <iostream>

using namespace std;

 

void main()

    {

    int dag_antal, dagspris;

    cout << "Antal dagar? ";

    cin >> dag_antal;

    cout << "Pris per dag?";

    cin >> dagspris;

    cout << "Totalt pris: "

        << dag_antal * dagspris << endl;

 

    char end;

    cout << "Tryck valfri char - end";

    cin >> end;

    }

 

//Hyra bil 2 sid 36

#include <iostream>

using namespace std;

 

void main()

    {

    int dag_antal, dagspris, tot_pris;

    const skatt = 10;

    double kurs;

 

    cout << "Ange antal dagar och pris per dag: ";

    cin >> dag_antal >> dagspris;

    cout << "Växlingskurs?";

    cin >> kurs;

    tot_pris = skatt + dagspris * dag_antal;

    cout << "Totalt pris: " << tot_pris << " euro"

        << "(" << tot_pris * kurs << " kr) " << endl;

       

    char end;

    cout << "Q = avsluta";

    cin >> end;

    }

 

 

//set precision

#include <iostream>

#include <iomanip>

using namespace std;

 

void main()

    {

    int dag_antal, dagspris, tot_pris;

    const skatt = 10;

    double kurs;

 

    cout << "Ange antal dagar och pris per dag: ";

    cin >> dag_antal >> dagspris;

    cout << "Växlingskurs?";

    cin >> kurs;

    tot_pris = skatt + dagspris * dag_antal;

    cout << "Totalt pris: " << tot_pris << " euro"

        << setiosflags(ios::fixed) << setprecision(2)

        << "(" << tot_pris * kurs << " kr) " << endl;

       

    char end;

    cout << "Q = avsluta";

    cin >> end;

    }

 

//set precision 2

#include <iostream>

#include <iomanip>

 

using namespace std;

 

void main()

    {

   

    int antal;

    double per_st, exkl_moms, inkl_moms, moms;

    const double moms_procent = 25.0;

    cout << "Antal enheter?:"; cin >> antal;

    cout << "Pris per enhet? "; cin >> per_st;

    exkl_moms = per_st * antal;

 

    moms = exkl_moms * moms_procent / 100;

    inkl_moms = exkl_moms + moms;

 

    cout << endl <<

    "FAKTURA" << endl <<"======" << endl <<

    "Antal enheter:" << setw(9) << antal << endl <<

    setprecision(2) << setiosflags(ios::fixed) <<

    "Pris per enhet:" << setw(8) << per_st << endl <<

    "Totalt pris:" << setw(11) << inkl_moms << endl <<

    "Varav moms:" << setw(12) << moms << endl;

 

 

 

 

 

    char end;

    cout << endl  << endl;

    cout << "Q = avsluta";

    cin >> end;

    }

 

//Faktura sid 40

#include <iostream>

#include <iomanip>

using namespace std;

 

void main()

    {

   

    int antal;

    double per_st, exkl_moms, inkl_moms, moms;

    const double moms_procent = 25.0;

    cout << "Antal enheter?:"; cin >> antal;

    cout << "Pris per enhet? "; cin >> per_st;

    exkl_moms = per_st * antal;

 

    moms = exkl_moms * moms_procent / 100;

    inkl_moms = exkl_moms + moms;

 

    cout << endl <<

    "FAKTURA" << endl <<"======" << endl <<

    "Antal enheter:" << setw(9) << antal << endl <<

    setprecision(2) << setiosflags(ios::fixed) <<

    "Pris per enhet:" << setw(8) << per_st << endl <<

    "Totalt pris:" << setw(11) << inkl_moms << endl <<

    "Varav moms:" << setw(12) << moms << endl;

    char end;

    cout << endl  << endl;

    cout << "Q = avsluta";

    cin >> end;

    }

 

 

//if and else sid 46

#include <iostream>

#include <iomanip>

#include "iodos.h"

using namespace std;

 

void main()

    {

    dos_console(); //för att få svenska bokstäver

    int antal;

    double per_st, pris, rabatt;

    const int rabatt_procent = 10, grans = 1000;

 

    cout << "Köpta antal enheter? "; cin >> antal;

    cout << "Pris per enhet? "; cin >> per_st;

    pris = per_st * antal;

 

    if(pris > grans)

        {

        rabatt = pris * rabatt_procent/100;

        pris -=rabatt;

        }

    cout << "Priset blir: " << fixed << setprecision(2) <<

        pris << endl;

 

    char a;

    cout << "Tryck bokstav eller siffra = avsluta" << endl;

    cin >> a;

    }

 

 

//ränta på ränta sid 45

#include <iostream>

#include <iomanip>

#include <cmath>

#include "iodos.h"

using namespace std;

 

void main()

    {

dos_console();

    double belopp, ranta;

    int n;

    cout << "Insatt belopp?: " ; cin >> belopp;

    cout << "Ränta? "; cin >> ranta;

    cout << "Antal år? ";  cin >> n;

 

    cout << setprecision(2) << setiosflags(ios::fixed)

        << "Kapitalet blir: " << belopp * pow(1 + ranta/100, n);

         

 

    char a;

    cout << endl << "Siffra eller bokstav - avslutar";

    cin >> a;

    }

 

 

//Miljonär sid 53

#include <iostream>

#include <iomanip>

#include "iodos.h"

using namespace std;

 

void main()

    {

    dos_console();

    int antal_dagar = 1;

    double dagslon = 0.01, totalt_belopp = 0.01;

    const double onskat = 1000000.0;

    while(totalt_belopp < onskat)

        {

        antal_dagar++;

        dagslon *= 2;

        totalt_belopp +=dagslon;

        }

    cout << "Du blir miljonär efter " << antal_dagar << " dagar"

        << endl;

 

    char a;

    cout << "Tryck bokstav eller siffra för att avsluta" << endl;

    cin >> a;

    }

 

 

 

//epsilon sid 56

#include <iostream>

#include <iomanip>

#include <cmath>

#include "iodos.h"

using namespace std;

 

 

/* förutsättning: MATEMATISK SERIE

 

1/1*1 - 1/2*2 + 1/3*3 - 1/4*4 + 1/5*5   ........

*/

void main()

    {

    dos_console();

    double summan = 0, nasta_term = 1, tecknet = 1;

    int k = 1;

    const antal_decimaler = 5;

    const double epsilon = 1e-6;

    while (fabs(nasta_term) >= epsilon)

        {

        summan += nasta_term; // lägg till nästa term till summan

        k++; // öka nämnaren med ett

        tecknet = -tecknet;// växlar från + till - varannan gång

        nasta_term = tecknet/(k * k); //räkna ut nästa term

        }

    cout << "Summan blir: " << setprecision(antal_decimaler)

        << summan << endl;

 

 

    char a;

    cout << "Tryck valfri tangent för att avsluta" << endl;

    cin >> a;

    }

 

 

//läsa in tal sid 57

include <iostream>

#include <iomanip>

#include "iodos.h"

using namespace std;

 

 

 

void main()

    {

    dos_console();

    double tal, max_tal = -1, sum = 0;

    int n = 0;

    cout << "Ctrl-Z markerar slut på indata eller 0" << endl;

    cout << "Skriv in olika tal - programmet sorterar ut det största";

    while (cin >> tal) //om sant - ett tal matats in

        {

        sum +=tal;

        n++;

        if(tal > max_tal)

            max_tal = tal;

        if(tal == 0)

            break;

        }

    cout << "Största talet  är: " << max_tal << endl;

    cout << "Medelvärdet är: " << sum/n << endl;

 

    char a;

    cout << "Tryck tangent för att avsluta" << endl;

    cin >> a;

    }

 

 

//while – break sid 59

#include <iostream>

#include <cmath>

#include "iodos.h"

using namespace std;

 

 

void main()

    {

    dos_console();

    double a, b, c;

    cout << "BERÄKNING AV HYPOTENUSAN" << endl;

    cout << "========================" << endl << endl;

    while(true) //samma som while(1) - alltid sant

        {

        cout << "Ange kateternas längder. "

            << "Avsluta med ett negativt tal. " << endl;

        cin >> a;

        if(a<= 0)

            break;

        cin >> b;

        if(b <= 0)

            break;

        c = sqrt(a * a + b* b);

        cout << "Hypotenusan har längden " << c << endl;

        }

 

    char ch;

    cout << "Mata in något för att avsluta" << endl;

    cin >> ch;

    }

 

//while – break sid 60

#include <iostream>

#include <cmath>

#include "iodos.h"

using namespace std;

 

 

void main()

    {

    dos_console();

    double a, b, c;

    cout << "BERÄKNING AV HYPOTENUSAN" << endl;

    cout << "========================" << endl << endl;

    while(true) //samma som while(1) - alltid sant

        {

        cout << "Ange kateternas längder. "

            << "Avsluta med Ctrl-z. " << endl;

        if(!(cin >> a)) //om inte a har matats in

            break;

        if(!(cin >> b))

            break;

        c = sqrt(a * a + b* b);

        cout << "Hypotenusan har längden " << c << endl;

        }

 

    }

 

 

//försälning sid 66

#include "iodos.h"

#include <iostream>

#include <iomanip>

using namespace std;

 

 main()

 {

   dos_console();

   const int   maxantal=100;

   const float grans=50000., pro1=0.1, pro2=0.15;

   float tab[maxantal], belopp, arvode;

   int   i, nr;

   // Nollställ tabellen

   for (i=0; i<maxantal; i++)

     tab[i] = 0;

   // Läs in försäljningsuppgifter

   while(cin >> nr && cin >> belopp)

   {

     if (nr < 1 || nr > maxantal || belopp < 0)

       cout << "Felaktiga indata" << endl;

     else

       tab[nr-1] += belopp;

   }

   // Skriv sammanställning

   cout << endl

        << "Nummer     Belopp     Arvode" << endl

        << "======     ======     ======" << endl;

   for (i=0; i<maxantal; i++)

   {

     if (tab[i] > 0)

     {

       if (tab[i] <= grans)

         arvode = pro1 * tab[i];

       else

         arvode = pro1*grans + pro2*(tab[i]-grans);

       cout << setw(4) << (i+1)

       << setprecision(0) << setiosflags(ios::fixed)

       << setw(13) << tab[i]

       << setw(10) << arvode << endl;

     }

   }

 }

 

 

//sorterings algoritm sid 68

#include "iodos.h"

 #include <iostream>

 using namespace std;

 

 void main()

 {

   dos_console();

   int n =40; //n = tal i fältet

   int temp;

    int f[] = { 1, 5 ,7,8,9,12,14,15,16,65,76,86,43,75,97,97,86,54,43

        ,56,76,8,9,34,3,2,3,5,1,9,23,235,235,234,5632,5423,11,2,3,2,1,

        578,87,845,83,15,73,623,467};

     

 

   cout << "SORTERINGSALGORITM" << endl;

   cout << "==================" << endl << endl;

   

 

   //Sortera fältet

   for (int tal = 0; tal < n; tal++)

       {

       //leta reda på minsta talen bland nr k  till n-1

       int minsta = tal;

       for(int i = tal+1; i< n; i++)

           if(f[i] < f[minsta])

               minsta= i;

           //låt talen nr tal och minsta byta plats

           temp = f[tal];

           f[tal] = f[minsta];

           f[minsta] = temp;

       }

   //Skriv ut det sorterade fältet

   for(int j = 0; j < n; j++)

       cout << f[j] << " " ;

     }

 

 

//fakultet sid 75

#include "iodos.h"

#include <iostream>

using namespace std;

 

 void main()

 {

   dos_console();

   double prod = 1;

   int n;

    cout << "Detta program skriver ut FAKULTETEN av n tal" <<

        endl <<"======================================" <<

        endl << endl << "Skriv antal tal: ";

    cin >> n;

    for(int i = 1; i <= n; i++)

        prod *=i;

    cout << "Resultatet blir blir: " << prod;

 

    char ch;

    cout << endl << "Mata in något för att avsluta" << endl;

    cin >> ch;

     }

 

 

 

//linjär sökning

#include <iostream>

#include "iodos.h"

using namespace std;

 

 

void main()

    {

    dos_console();

    int k, tal;

     int n = 40; //fältet innehåller ca 40 element

    int f[] = {2,5,6,1,0,2,8,34,45,76,4,56,89,0,9,67,4,2,34,34,2,1,3,55,

        456,654,765,67,12,13,14,15,16,17,18,15,14,16,7564};

 

    cout << "Vilket tal letar du efter?" << endl;

    cin >> tal;

    for(k=0; k < n && f[k] != tal; k++)

        ;

    if(k < n)

        cout << "Talet finns på plats nr " << k + 1 <<endl;

    else

        cout << "Talet finns inte " << endl;

 

    char ch;

    cin >> ch;

    }

 

 

 

//character sid 81 -83

#include <iostream>

#include "iodos.h"

using namespace std;

 

void main()

    {

    dos_console();

 

    char teck1 = 'ö';     //enskilda tecken skrivs med enkel apostrof 'z'

    char teck2 = 'å';

    char teck3;

    char t;

    t =teck2 < teck1 ? teck1 : teck2;

    cout << t << endl;

    teck1 = '\''; //använd backslash för att skriva enkelt och dubbelt

    teck2 = '\\';//citations tecken + backslash

    teck3 = '\"';

    cout << teck1 << " " << teck2 << " " << teck3 << endl;

    teck1 = '\123'; //oktalt skrivsätt

    teck2 = '\xff';

    cout << teck1 << " " << teck2  << endl;

 

    }

 

 

 

//enstaka tecken

#include <iostream>

#include "iodos.h"

using namespace std;

 

void main()

    {

    dos_console();

 

    char teck;

/*    cout << "Skriv ett tecken" << endl;

    cin >> teck;  //läser in ett tecken - ej blanka

    cout << "Tecknet var " << teck << endl;

 

    while(cin.get(teck)) //läser in ett tecken även blanka

   cout << teck;

*/

    //cin.peek() tjuvtittar på nästa tecken som matas in

    //cin.ignore(100,'x') hoppar över 100 st x bokstäver

    //cin >> ws; enklare att använda = hoppar över alla blanka tecken

    while(cin.peek() == ' ' || cin.peek() == 't' || cin.peek() == '\n')

        cin.ignore (); //hoppar över alla vita tecken, tab och radmatning

    }

 

 

//datum 

#include <iostream>

#include "iodos.h"

#include <string>

 

using namespace std;

 

void main()

    {

    dos_console();

     

     char a[9], s[11] = "20  -  -  ";

 

    cout << "Ange datum som mm/dd/yy";

    cin.getline(a,9);

 

    s[2] = a[6];

    s[3] = a[7]; //år

    s[5] = a[0];

    s[6] = a[1]; //månad

    s[8] = a[3];

    s[9] = a[4]; //dag

 

    cout << "På svenskt sätt skrivs det " << s << endl;

    }

 

 

//string find sid 93

#include <iostream>

#include "iodos.h"

#include <string>

 

using namespace std;

 

void main()

    {

    dos_console();

     string s1 = "subklasser och superklasser";

     string s2 = "klass";

     s1.find(s2); //ger värdet 3       string::npos saknas likhet

     s1.find("ser"); //ger värdet 7

     s1.find('a'); //ger värdet 5

     s1.find("som"); // ger string::npos

 

    int i = s1.find("klass");

    if(i == string::npos)

        cout << "Finns ej";

    else

        cout << "Finns i pos " << i;

      i = s1.find("som");

    if(i == string::npos)

        cout << "Finns ej";

    else

        cout << "Finns i pos " << i;

 

    }

 

 

 

//Datum strcpy

#include <iostream>

#include "iodos.h"

#include <cstring> //här måste man använda cstring

 

using namespace std;

 

void main()

    {

    dos_console();

     

     char a[9], s[11] = "20  -  -  ";

 

    cout << "Ange datum som mm/dd/yy";

    cin.getline(a,9);

   

    strncpy(s+2, a+6, 2);//år

    strncpy(s+5, a+0, 2);//mån

    strncpy(s+8, a+3, 2);//dag

 

    cout << "På svenskt sätt skrivs det " << s << endl;

    }

 

 

 

 

//strcpy2

#include <iostream>

#include "iodos.h"

#include <cstring> 

 

using namespace std;

 

void main()

    {

    dos_console();

     

     char a[4], b[4] ="xyz", namn[10];

 

    strcpy(a,b);    //kopierar b till a  som innehåller xyz

    cout << a << endl; //kopierar även \0 tecknet

    strcpy(namn,"Levi"); //farligt - ingen kontroll om plats finns

    cout << namn << endl;

    strncpy(a,namn,3);  //säkrare att använda

    a[4] = '\0'; //för säkerhets skull

 

 

    cout << a << endl;

 

    string str_namn;

    str_namn = namn; //lätt att tilldela teckenfält till stringvariabel

    strcpy(namn, str_namn.c_str ());//omvänt är svårare - måste använda

                            // funktionen s_str()

 

    }

 

 

 

//strcmp sid 109

#include <iostream>

#include "iodos.h"

#include <cstring> 

 

using namespace std;

 

void main()

    {

    dos_console();

     

    char namn1[20], namn2[20];

    cout << "Skriv två namn på var sin rad \n";

    cin.getline(namn1,20);

    cin.getline(namn2,20);

 

    if(strcmp(namn1, namn2) < 0)

        cout << namn1 << " kommer först" << endl;

    else if (strcmp (namn1, namn2) > 0)

        cout << namn2 << " kommer först" << endl;

 

    else

        cout << "Namnen är lika " << endl;

 

 

    }

 

 

//funktioner sid 113

#include <iostream>

#include "iodos.h"

using namespace std;

 

double medelv(double x, double y)

    {

    return (x+y)/2;

    }

 

int max(int a, int b)

    {

    if(a>b)

        return a;

    else

        return b;

    }

 

 

int main()

    {

    dos_console();

    double tal1, tal2, mv;

    cout << "Ge två reela tal " << endl;

    cin >> tal1  >> tal2;

    mv = medelv(tal1,tal2);

    cout << "Medelvärdet är " << mv << endl;

 

    //anrop av funktionen max

    int a,b,c,m;

    cout << "Skriv tre tal (funktionen beräknar största talet)" << endl;

    cin >> a >> b >> c;

 

    m = max(a,b);

    m = max(m,c);

    cout << m << " är störst" << endl;

 

    //går även att skriva

    cout << max(max(a,b),c) << " är störst" << endl;

    //här beräknas först det inre funktionsanropet max(a,b) och därefter

    //beräknas det yttre

 

return 0;

 

    }

 

 

//funktioner 2

#include <iostream>

#include "iodos.h"

#include <vector>

using namespace std;

 

    //beräknar längden av en sträng

    int langd(char s[])

    {

     int n=0;

     while(s[n] != '\0')

         n++;

     return n;

    }

 

    //beräknar summan av ett fält argumentet n anger antalet element

    int sum(int a[], int n)

    {

    int s = 0;

    for(int i=0; i<n; i++)

        s += a[i];

    return s;

    }

 

    //beräknar summan i en vector

    int sumvector(vector<int> a)

    {

    int s= 0;

    for(int i=0; i<a.size(); i++)

    s += a[i];

    return s;

    }

 

void main()

    {

    dos_console();

    char a[100]= "LEVI", b[10] = "X";

    //beräkna längden

    cout << a << " = " << langd(a) << endl;

    cout << b << " = " << langd(b) << endl;

 

    int c[10] = {1,2,3,4,5,6,7,8,9,10};

    cout << "summa = " << sum(c ,10) << endl;

   

    cout <<"läs in tal";

    vector<int> tab;

    int tal;

    //inläsning av talen i en vector

    while(cin >> tal)

        tab.push_back(tal);

    cout << "Beräkning av summa i en vector " << sumvector(tab) << endl;

 

    }

 

 

 

 

//binärsökning sid 119

#include <iostream>

#include "iodos.h"

#include <vector>

using namespace std;

 

   

 

    //binär sökning

    int bin_sok(int sokt, int f[], int n)

    {

    int forsta = 0, sista = n-1;

   

    while(forsta <= sista)

        {

        int mitten = (forsta + sista)/2;

        if(sokt < f[mitten])

            sista = mitten-1;

        else if(sokt > f[mitten])

            forsta = mitten+1;

        else //lika

            return mitten;

        }

 

 

    return -1; //inte funnen

    }

 

    

 

void main()

    {

    dos_console();

    int a[] = {2,6,8,12,34,45,67,78,123,135,156,200,255,256,267,277,

                    377,388,400,456};

    int svar,s;

    cout << "Vilket tal letar du efter? "; cin >> s;

    svar=bin_sok(s,a,20);

    if(svar == -1)

        cout << "\nTalet finns ej" << endl;

    else

        cout << "Talet är element nr " << svar+1 << endl;

 

    }

 

//funktioner 3 sid 123 framåt

#include <iostream>

#include "iodos.h"

#include <cstring>

using namespace std;

 

 void skip_line() //bättre än att använda cin.ignore

        {

        while(cin.peek() != EOF && cin.get() != '\n')

            ;

        }

    

 

 

 int get()

    {

    int i;

    while(!(cin >> i) || cin.peek() != '\n')

        {

        cout << "Felaktig parameter - försök igen";

        cin.clear(); //upphäv feltillstånd

       // cin.ignore(100, '\n'); //hoppa till nästa rad

        skip_line();

        }

    return i;

    }

 

   void byt_ut(char s[], char c, char cny)

       {

       int n= 0;

       while(s[n] != '\0')

           {

           if(s[n] == c)

               s[n] = cny;

           n++;

           }

       }

 

void main()

    {

    dos_console();

    /*

     int i;

     cout << "Skriv ett heltal";

     i= get();

     cout <<  i << endl;

     */

    char a[] = "JAG VILL BYTA UT & & & TILL &&&";

        byt_ut (a,'&','%');

    cout << a;

 

    }

 

 

 

 

//referenser

//main.cpp

#include "iodos.h"

#include <cstring>

#include "simpleio.h"

using namespace std;

 

   

 

 

    

void main()

    {

    dos_console();

     char a[30];

     double sum = 0;

     int n = 0;

     get(a,30);

    

     

     while(strlen(a) > 0)

         {

         n++;

         sum += strlen(a);

         get(a,30);

         }

     put("Antal ord:");

     put(n,13);

     new_line();

     put("Genomsnittlig längd.");

     put(sum/n,3,1);

     new_line();

    }

 

 

 

//simpleio

#include <iostream>

#include <iomanip>

#include "simpleio.h"

using namespace std;

 

void get(char s[], int n)

    {

    int i=0;

    cin >> ws; //hoppa över vita tecken

    while(i<n-1 && cin.peek() != ' ' && cin.peek() != '\t'

        && cin.peek() != '\n' && cin.peek() != EOF)

        {

        cin >> s[i]; //läs icke vitt tecken

        i++;

        }

    s[i] = '\0';

    }

 

void skip_line() //Hoppar fram till nästa inläsningsrad

    {

    while(cin.peek() != EOF && cin.get() != '\n')

        ;

    }

 

 

 

 

 

void put(double x, int fore, int aft)

    {

    cout << setprecision (aft) << setiosflags(ios::fixed)

        << setw(fore+aft+1) << x << setprecision (6)

        << resetiosflags(ios::fixed);

    }

 

void put(int i, int width)

    {

    cout << setw(width) << i;

    }

 

void put(char s[])

    {

    cout << s;

    }

 

void new_line()

    {

cout << endl;

    }

 

void get(int& i)

    {

    while(!(cin >> i) || cin.peek() != '\n')

        {

        cout << "Felaktigt heltal. Försök igen";

        cin.clear();

        skip_line();

        }

    }

 

 

void get(double& y)

    {

    while(!(cin >> y) || cin.peek() != '\n')

        {

        cout << "Felaktigt heltal. Försök igen";

        cin.clear();

        skip_line();

        }

    }

//Header filen simpleio.h

void get(char s[], int i);

void skip_line();

void get(int& i); //referens

void get(double& y); //referens

void put(double x, int fore =1, int aft = 6);

void put(int i, int width =1);

void put(char s[]);

void new_line();

 

//main.cpp (simpleio)

#include "iodos.h"

#include <cstring>

#include "simpleio.h"

using namespace std;

    

void main()

    {

    dos_console();

     char a[30];

     double sum = 0;

     int n = 0;

     get(a,30);

     while(strlen(a) > 0)

         {

         n++;

         sum += strlen(a);

         get(a,30);

         }

     put("Antal ord:");

     put(n,13);

     new_line();

     put("Genomsnittlig längd.");

     put(sum/n,3,1);

     new_line();

    }

 

 

//andragradsekvation sid 138

#include <cmath>

#include <iostream>

#include "simpleio.h"

#include "iodos.h"

using namespace std;

 

// x= -p/2 +- roten ur p upphöjt till 2/4 - q

void rotter(double p, double q, double& rot1, double& rot2, bool& ok)

    {

    double d = p*p/4 -q; //diskriminanten måste vara större än 0 om

                        //det skall finnas rötter

    if(d<0)

        ok=false;

    else

        {

        rot1 = -p/2 + sqrt(d);

        rot2 = -p/2 - sqrt(d);

        }

    }

 

 

void main()

    {

    dos_console();

    double a, b, r1, r2;

    bool gick_bra;

    put("p?"); get(a);

    put("q?"); get(b);

    rotter(a,b,r1,r2,gick_bra);

    if(gick_bra)

        {

        put("Rötterna är "); put(r1,1,2);

        put(" och "); put(r2,1,2);

        }

    else

        put("Reella rötter saknas");

    }

 

 

 

//giltig variabel sid 140

#include <string>

#include <iostream>

#include "iodos.h"

using namespace std;

 

 bool ord(const string& s)

    {

     int i=0;

     while(i<s.size())

         {

         char c = s[i];

         if((c >= 'a' && c <= 'z') || (c >= 'A' && c<= 'Z') ||

            c == 'å' || c=='ä' || c=='ö' ||c == 'Å' || c=='Ä' || c=='Ö')

            i++;

         else

             return false;

         }

     return true;

    }

 

 

void main()

    {

    dos_console();

    string w;

    while (cin >> w)

        if(ord(w))

            cout << "Ett ord" << endl;

        else

            cout << "Inget ord" << endl;

   

    }

 

 

 

//default värde sid 141

#include <string>

#include <iostream>

#include "iodos.h"

using namespace std;

 

void skriv_flera(char c, int ant=2);//default värde-bara i deklarationen

 

void skriv_flera(char c , int ant) //ej här

    {

     for (int i = 1; i<=ant;i++)

         cout << c;

    }

 

 

void main()

    {

    dos_console();

    char a  = '*';

    skriv_flera(a,4);

    skriv_flera(a); //här blir default värde

    }

 

 

 

//default värde  2

#include <string>

#include <iostream>

#include "iodos.h"

using namespace std;

 

//default värde-bara i deklarationen

void skriv_flera(char c, int ant=2, bool ny_rad = false);

 

void skriv_flera(char c , int ant, bool ny_rad) //ej här

    {

     for (int i = 1; i<=ant;i++)

         {

         cout << c;

         if(ny_rad)

             cout << endl;

         }

    }

 

 

void main()

    {

    dos_console();

    char a  = '*';

    skriv_flera(a,4);

    skriv_flera('&'); //här blir default värde

    skriv_flera('%',10,true);

    }

 

 

 

//rekursiva funktioner –fakultet sid 143

#include <iostream>

#include "iodos.h"

using namespace std;

 

int nfak(int n) 

    {

      if(n <= 0)

          return 1;

      else

          return n*nfak(n-1);

    }

 

 

void main()

    {

    int m = 0;

    m= nfak(3);

    cout << m << endl;

    }

 

 

 

 

//rekursivt – text baklänges sid 145

#include <iostream>

#include "iodos.h"

using namespace std;

 

void baklanges( ) 

    {

      char c;

      if(cin.get(c))

          {

          baklanges();

          cout << c;

          }

    }

 

 

void main()

    {

  baklanges();

    }

 

 

 

//anagram sid 155

//Ett program som kollar om en fras eller ord är ett anagram

//Anagram är ett ord som kan bilda ett annat ord med samma bokstäver

#include <iostream>

#include "iodos.h"

using namespace std;

 

bool anagram(char s1[], char s2[]) 

    {

      int f1[256], f2[256], i;

    //nollställ f1 och f2

      for(i=0; i<256;i++)

          f1[i] = f2[i] = 0;

      //räkna antalet olika tecken i s1

      for(i=0; s1[i];i++)

          f1[(unsigned char)s1[i]]++; //

       //räkna antalet olika tecken i s2

      for(i=0; s2[i];i++)

          f2[(unsigned char)s2[i]]++;

 

      for(i=0; i<256;i++) //jämför f1 och f2

          if(f1[i] != f2[i])

              return false;

          return true;

 

    }

 

 

void main()

    {

    dos_console();

    char ord1[50], ord2[50];

    cout << "Kollar om två ord är ett anagram" 

        << " - skriv två ord" << endl;

    cin >> ord1 >> ord2;

    if(anagram(ord1,ord2))

        cout << ord1 << " och " << ord2 << " är ett anagram" << endl;

    else

        cout << ord1 << " och " << ord2 << " INGET ANAGRAM" << endl;

 

    }

 

 

//sizeof operatorn

#include <iostream>

#include "iodos.h"

using namespace std;

 

 

void main()

    {

    dos_console();

    cout << "sizeof unsigned char: " << sizeof(unsigned char) << endl;

    cout << "sizeof char:          " << sizeof(char) << endl;

    cout << "sizeof unsigned int:  " << sizeof(unsigned int) << endl;

    cout << "sizeof int:           " << sizeof(int) << endl;

    cout << "sizeof long:          " << sizeof(long) << endl;

    cout << "sizeof float:         " << sizeof(float) << endl;

    cout << "sizeof double:        " << sizeof(double) << endl;

    cout << "sizeof long double:   " << sizeof(float) << endl;

    cout << endl;

    }

 

//<float> sid  158

/*De fördefinerade flyttalstyperna float, double long double

#include <cfloat> innehåller diverse info om de olika standardtyperna f

ör reella tal. Vill man ha reda på största och minsta tal som kan lagras

och nogrannhet finns konstanterna DBL_DIG, DBL_MAX,DBL_MIN FLT_DIG,

FLT_MAX, FLT_MIN för float och LDBL_DIG, LDBL_MAX,LDBL_MIN för long double

*/

 

#include <iostream>

#include "iodos.h"

#include <cfloat>

using namespace std;

 

 

void main()

    {

    dos_console();

    cout << "Noggrannhet för typen float       " <<FLT_DIG<< endl;

    cout << "Minsta tal för typen float        " <<FLT_MIN << endl;

    cout << "Största tal för typen float       " <<FLT_MAX<< endl;

    cout << "Noggrannhet för typen double      " <<DBL_DIG<< endl;

    cout << "Minsta tal för typen double       " <<DBL_MIN << endl;

    cout << "Största tal för typen double      " <<DBL_MAX<< endl;

    cout << "Noggrannhet för typen long double " <<LDBL_DIG<< endl;

    cout << "Minsta tal för typen long double  " <<LDBL_MIN << endl;

    cout << "Största tal för typen long double " <<LDBL_MAX<< endl;

   

    }

 

 

//pekare sid 159

#include <iostream>

#include "iodos.h"

 

using namespace std;

//int sum(int a[], int n) //samma som nedanstående

int sum(int *a, int n) //*a är en pekare till fältet

    {

    int s =0;

    for(int *ip = a; ip < a+n; ip++)

        s += *ip;

    return s;

    }

 

int sum_rekursivt(int *a, int n) //*a är en pekare till fältet

    {

     if(n<=0)

         return 0;

     else

         return *a + sum_rekursivt(a+1,n-1);

    }

 

 

void main()

    {

    dos_console();

    int f[10];

    int* pf;

    pf = f;

    for(int i = 0;i<10;i++)

        f[i] = i+1;

//detta är precis lika

    cout << f[1] <<endl;    //element nr 1  som vanligt

    cout << *(pf+1) << endl;//pekare till första elementet

    cout << 1[f] << endl;   //??

    cout << *(1+f) << endl; //eftersom f är ett fält är f en pekare

    cout <<"Med pekare" << endl;

    //ökar alla elementen i fältet f med 10 via pekare

    for(int *p = f; p<f+10; p++)

        {

        *p += 10;

        cout << "pekaren p har adressen " <<  p << " och innehåller "

        <<  *p <<  endl;

        }

 //   cout << "Exempel summa " <<sum(f,10) << endl;

    cout << "Exempel summa " <<sum(f,sizeof f/sizeof f[0]) << endl;//bättre

 

    cout << "Summera rekursivt " << sum_rekursivt(f,sizeof f/sizeof f[0])

        << endl;

 

    }

 

//binär  sök  rekursivt sid 168

#include <iostream>

#include "iodos.h"

 

using namespace std;

 

   

 

    //binär sökning

    int *bin_sok(int sokt, int *forsta, int *sista)

    {

  

   

   if(forsta > sista)//fältet saknar element

       return 0;

      

        int *mitten =  forsta + (sista-forsta)/2;

        if(sokt <  *mitten )

           return bin_sok(sokt, forsta , mitten-1);

        else if(sokt > *mitten )

            return bin_sok(sokt, mitten +1, sista);

        else //lika

            return mitten;

       

 

 

   

    }

 

    

 

void main()

    {

    dos_console();

    int a[] = {2,6,8,12,34,45,67,78,123,135,156,200,255,256,267,277,

                    377,388,400,456};

    int  s;

    cout << "Vilket tal letar du efter? "; cin >> s;

   

    int svar=0;

    int *psvar= &svar;

     psvar=bin_sok(s,a,a+15);

     svar=*psvar;

        cout << "Talet är element nr " <<   svar << endl;

 

    }

 

 

 

 

//pekare till char

#include <iostream>

#include "iodos.h"

 

using namespace std;

 

   

 

    

 

void main()

    {

    dos_console();

     char namn[] = "Sara";

     char *p;

     p =namn;

     cout << namn << " " << p << endl;

     char *pnamn = " Svensson"; //kan man också göra

     cout << namn <<  pnamn << endl;

     //vill man skriva ut enskilda tecken måste man avreferera pekaren

     cout << *(p) << pnamn << endl; //skriver ut S Svensson

     //man kan också ha konstant pekare till char

     const char *q ="Hanna"; //går inte att ändra det pekaren pekar på

     //Det är vanligt att man använder pekare i stället för indexering

     //i text strängar

    }

 

 

 

//strlen med pekare sid 170

#include <iostream>

#include "iodos.h"

 

using namespace std;

 

   

int charlen(const char *s)//ger längden av s

    {

    const char *p = s;

    while(*p++)//upprepas till man kommer till '\0' tecknet - while blir

        ; //false  och avslutas

    return p-1-s; //dra ifrån 1 för nolltecknet. Längden blir slutet - början

    }

 

    

 

void main()

    {

    dos_console();

     char namn[ ] = "Sara";

     cout << charlen(namn) << endl;

     char * pn = "Levi Johansson";

 

      cout <<  charlen(pn) << endl;

 

    }

 

 

//strcpy med pekare sid 171

#include <iostream>

#include "iodos.h"

#include <string>

using namespace std;

 

 

 

 void strcopy(char *s1, const char *s2)

     {

     while(*s1++ = *s2++)

         ;

     

     }

void skriv(const char *pp[], int i) //pp är const pekare till pekare

    {                              // samma som char **pp

    cout << pp[i] << endl;

    }

 

void main()

    {

    dos_console();

     

     

     char text1[100] = "Levi";

     strcopy(text1,"HEJ");

     cout << text1 << endl;

     //ett fält med pekare (array) eller vektor

     const  char *medd[4] = {"Meddelande 1", "Detta är meddelande nummer 2",

         "detta är ännu ett meddelande", "NU ÄR MEDDELANDEN SLUT"};

    

     for(int i =0; i<4; i++)

     skriv(medd ,i);  //skriver alla meddelanden

     skriv (medd,3);  //skriver sista meddelandet

    }

 

 

//Allokera minne new sid 173

#include <iostream>

#include "iodos.h"

#include <string>

using namespace std;

 

 

 

void main()

    {

    dos_console();

     

     double *pd; //en pekare av typen double

     pd = new double; //den variabel man allokerar minne för saknar namn

     //enda sättet att komma åt variablen är via pekaren

     //för att tilldela värde till pekaren kan vi skriva

     *pd = 2.5; //initiera det allokerade minnesutrymmet

 

     int n=10;

     int *pi = new int[n]; //fält med pekare till int

 

     //för att initera fältet kan vi skriva

     for(int i=0; i<n; i++)

         {

          pi[i]=0; //samma som  *(p+i)

        cout <<  pi[i]<< endl;

         }

     //för att radera pekare som skapats med new

     delete [] pd; //obs skrivsättet

     //för att radera en enskild pekare delete p;

    }

 

 

 

//referens variabel

#include <iostream>

#include "iodos.h"

using namespace std;

 

 void byt(int &a, int &b) //med referenser

     {

     

     int c = a;

     a = b;

     b= c;

     }

 void byt2(int *pa, int *pb) //med pekare

     {     

     int c = *pa;

     *pa = *pb;

     *pb= c;

     }

 

void main()

    {

    dos_console();

     

    int i = 10,j = 20;    

    cout << "Före funktionen byt i = " << i << " j = " << j << endl;

    byt(i,j);

    cout << "Efter funktionen byt i = " << i << " j = " << j << endl;

 

   

    cout << "Före funktionen byt2 i = " << i << " j = " << j << endl;

    byt2(&i,&j);

    cout << "Efter funktionen byt i = " << i << " j = " << j << endl;

 

    }

 

//funktions pekare sid 181

#include <iostream>

#include <cmath>

#include "iodos.h"

using namespace std;

 

 double nollstalle(double (*f)(double), double a, double b,

                         double eps = 1e-10 );  

     

 

double f(double x)

    {

    return x-1;

    }

double f2(double x)

    {

    return 2 * x * x* x - 3 * x * x - 18*x -8;

    }

 

void main()

    {

    dos_console();

     cout << nollstalle (f, 20, 10) << endl;

       cout << nollstalle (f2, 56 , 1 ) << endl;

  

    }

 

 double nollstalle(double (*f)(double), double a, double b,

     double eps  ) {

     if(f(a) > 0 && f(b) < 0) //byt a och b

         {

         double temp = a;

         a = b; b= temp;

         }

     

        if(f(a)< 0 && f(b) > 0)

         {

         cout << "Nollställe saknas " << endl;

         }

        //nu gäller f(a) < 0 < f(b)

      while(fabs (a-b) < eps)

          {

          double xm = (a+b)/2, fm = f(xm);

          if(fm < 0)

              a = xm;

          else if (fm > 0)

              b = xm;

          else

              return xm; // vi råkade hitta nollstället

          }

      return (a+b)/2;

     }

       

 

 

//enum sid 188

#include <iostream>

#include <cstring>

#include "iodos.h"

using namespace std;

typedef  char *enum_txt[];

 

 

    

int get_enum(enum_txt tab)

     {

     char s[100];

 

     if(cin >>s){

         for(int k=0; tab[k];k++)

             if(strcmp(s, tab[k]) == 0)

                 return k;

             cout << "Fel indata" << endl;

         }

     return -1;

     }

      

  

 

void main()

    {

    dos_console();

   

    enum farg {rod, gul,bla,lila,gron,orange};

    enum_txt tab1 = {"röd","gul","blå",0};

    enum_txt tab2 = {"röd","gul","blå","lila","grön","orange",0};

    farg f1, f2, blandning;

    while(true)

        {

        cout << "Ange två av färgerna röd gul eller blå" << endl;

        if((f1=farg(get_enum(tab1))) < 0 ||(f2=farg(get_enum(tab1))) < 0)

            break;

        if(f1 == rod && f2 == gul || f1 ==gul && f2 == rod)

            blandning = orange;

        else if (f1 == gul && f2 == bla || f1 ==bla && f2 == gul)

            blandning = gron;

        else if (f1 == rod && f2 == bla || f1 ==bla && f2 == rod)

            blandning = lila;

        else

            blandning = f1; //sammafärg

        cout << "Färgblandningen blir " << tab2[blandning] << endl;

        }   

    }

 

 

//enum 2

#include <iostream>

 

#include "iodos.h"

using namespace std;

typedef const char *enum_txt[];

 

 

    

int get_enum(enum_txt tab)

     {

     char s[100];

 

     if(cin >>s){

         for(int k=0; tab[k];k++)

             if(strcmp(s, tab[k]) == 0)

                 return k;

             cout << "Fel indata" << endl;

         }

     return -1;

     }

      

 

 

void main()

    {

    dos_console();

   

     enum veckodag{mandag, tisdag, onsdag, torsdag, fredag, lordag, sondag};

     enum_txt dag_tab = {"Måndag", "Tisdag", "Onsdag", "Torsdag",

         "Fredag", "Lördag", "Söndag", 0};

     int idag = lordag;

 

    cout << "Idag är det " << dag_tab[idag];

    cout <<"Vilken veckodag är det idag?";

    idag = veckodag(get_enum(dag_tab));

   

    cout << "Idag är det " << dag_tab[idag];

 

    }

 

 

//matriser sid 193

#include <iostream>

 

#include "iodos.h"

using namespace std;

 

 

 

    

void skriv(int a[][4 ], int rad)

     {

      for(int i=0; i< rad; i++)

          {

          for(int j=0;j< 4;j++)

              cout << a[i][j] << ' ';

          cout << endl;

          }

     }

      

 

 

void main()

    {

    dos_console();

   

    int m[3][4];

   

    skriv(m,3); //skriver ut en matris med 3 rader

    }

 

 

//matriser med vector

#include <iostream>

#include <vector>

#include <iomanip>

#include "iodos.h"

using namespace std;

typedef vector<double> rad; //vanlig vector

typedef vector<rad> matris; //matris består av ett antal element rad

 

void add(matris a, matris b, matris& c)//c är en utparameter - referensa

    {

    

        for(int i=0; i< a.size(); i++)

            for(int j=0;j<a[i].size();j++)

                c[i][j] = a[i][j] + b[i][j];

    }

 

void skriv(matris a)

     {

      for(int i=0; i< a.size(); i++)

          {

          for(int j=0;j<a[i].size();j++)

              cout << setw(4) <<a[i][j] ;

          cout << endl;

          }

     }

      

 

 

void main()

    {

    dos_console();

    matris m;

    const int antal_rader =12, antal_kolumner =10;

    m.resize (antal_rader);

    for(int j=0;j<antal_rader;j++)

        m[j].resize (antal_kolumner);

    for(int r=0; r< antal_rader; r++)

        for(int k=0; k<antal_kolumner; k++)

            m[r][k] = (r+1)*(k+1);   //lägger in multiplikationstabellen

    

   

    skriv(m ); //skriver ut multiplikationstabellen

 

    }

 

 

//ios::flaggor

#include <iostream>

using namespace std;

 

   

 

   

void main()

    {

    char a;

    cin >> a;

    if(clog.good()) //bool good()  ingen av tillståndsflaggorna är satt

        cerr << "Strömmen clog är OK";

 

    if(cin.fail()) //eller if(!cin)

        {

        cerr << "Inläsningen misslyckades";

        cin.clear();

   

        }

 

 

    int n=0;

    while(!cin.eof()) //OBS Fel

    {

    cin.get(a);

    n++;

    }

    cout << "Du skrev " << n << " tecken" << endl;

   

    n=0;

    while(true) //Korrekt

    {

    cin.get(a);

    if(cin.eof())

        break;

    n++;

    }

    cout << "Du skrev " << n << " tecken" << endl;

 

    n=0;

    while(cin.get(a)) //Enklast och korrekt

    n++;

   

    cout << "Du skrev " << n << " tecken" << endl;

}

 

 

 

//kopiera filer

#include <iostream>

#include <fstream>

#include <iomanip>

#include <cstdlib>

#include "iodos.h"

using namespace std;

 

   

 

   

void main()

    {

     dos_console();

    char namn[100];

    char c;

    cout << "Vilken fil skall kopieras" << endl;

    cin >> setw(100) >> namn;

    ifstream f1(namn);

    if(!f1)

        {

        cout << "Filen kan ej öppnas " << endl;

        exit(EXIT_FAILURE);

        }

    cout << "Kopians namn? " << endl;

    cin >> setw(100) >> namn;

    ofstream f2(namn);

    if(!f2)

        {

        cout << "Filen kan ej skapas " << endl;

        exit(EXIT_FAILURE);

        }

   

    while(f1.get(c))

           f2.put(c);

 

}

 

 

 

 

//filer – läsa

#include <iostream>

#include <fstream>

#include "iodos.h"

using namespace std;

 

   

 

   

void main()

    {

     dos_console();

    int n = 0;

    char c;

    ifstream f1("MY TEXT FILE.cpp");

    while(f1.get(c))

        {

        cout.put(c);

        if(c == '\n')

            n++;

        }

 

  

   

    cout << endl << "Filen består av " << n << " rader" << endl;

}

 

 

//filer – kopiera 2

#include <iostream>

#include <fstream>

#include <iomanip>

#include <cstdlib>

#include "iodos.h"

using namespace std;

 

   

 

   

void main()

    {

     dos_console();

    char namn[100];

   

    cout << "Vilken fil skall öppnas" << endl;

    cin >> setw(100) >> namn;

    ifstream f1(namn);

    if(!f1)

        {

        cout << "Filen kan ej öppnas " << endl;

        exit(EXIT_FAILURE); //EXIT_SUCCESS är motsvarande

        }

    

      

   //man kan använda rdbuf() som ger en pekare till filbufferten

    //hela bufferten skrivs ut

 

   cout << f1.rdbuf();

   //kopiera till en annan fil

   //f2 <<f1.rdbuf ();

   

   

}

 

 

 

//filer exempel rdbuf()

#include <iostream>

#include <fstream>

 

#include <string>

#include "iodos.h"

using namespace std;

 

   

 

   

void main()

    {

     dos_console();

    

    cout << "TELEFONLISTA" << endl;

    ofstream filut("telefon.txt",ios::app);

    string enamn, fnamn, tel;

    cout << "Ange efternamn, förnamn och tel - avsluta med Ctrl-Z" << endl;

    while(cin >> enamn && cin >> fnamn &&   cin >> tel)

           filut << enamn << " " << fnamn << " " << tel << endl;

       

   filut.close();

  

   //skriv ut filens innehåll

    

   ifstream filin("telefon.txt",ios::in);

   cout << endl << "Telefonlista" << endl;

 

 

   cout << filin.rdbuf();

   

   

}

    

 

 

//filer temporär fil

#include <iostream>

#include <fstream>

#include <cstdio>

#include <string>

#include "iodos.h"

using namespace std;

 

   

 

   

void main()

    {

     dos_console();

    

  

    string enamn1, fnamn1, tel1;

    string  enamn2, fnamn2, tel2;

    bool funnen = false;

 

     cout << "Ge efternamn, förnamn och nytt telefonnummer för"<< endl;

     cout    << "den person som skall ändras" << endl;

    cin >> enamn1 >>fnamn1 >> tel1;

 {

    ifstream fin("telefon.txt");

    ofstream fut("tempfil");

 

    while(fin >> enamn2 && fin >> fnamn2 &&  fin >> tel2)

        {

           fut << enamn2 << " " << fnamn2 << " ";

        if(enamn1 == enamn2 && fnamn1 == fnamn2)

            {

            funnen = true;

            fut << tel1 << endl; //skriv nytt telnr

            }

        else

            fut << tel2 << endl;

        }

    }

 

   if(funnen)

       {

       ifstream f1("tempfil");

       ofstream f2("telefon.txt");

       f2 << f1.rdbuf();

       }

   else

       cout << "Personen ej funnen" << endl;

   remove("tempfil");

   

} 

 

 

 

//filer direkt access 

#include <iostream>

#include<fstream>

 

  

#include "iodos.h"

using namespace std;

 

 

void main()

    {

    dos_console();

    ofstream fut("testfil.txt");

    fut << "första raden"<< endl;

    fut << "2:dra raden" << endl;

    fut.seekp(0, ios::beg); //ios::beg början begin of file

    fut << "XY";

    fut.seekp(5, ios::cur); // ios::cur aktuell pos

    fut << 'Z';

    streampos pos = fut.tellp();

    fut.seekp(0, ios::end);

    fut << "Sista raden " << endl;

    fut.seekp(pos);

    fut << 'W';

    fut.close();

    //skriv ut hella filen

    ifstream fin("testfil.txt");

    char c;

    while(fin.get(c))

        cout << c;

    //skriv ut slutet av filen igen

    fin.clear(); //OBS behövs för att nollställa eof flaggan

    fin.seekg(-10, ios::end);

    while(fin.get(c))

        cout << c;

    }

 

 

 

//filer direkt access 2

#include <iostream>

#include<fstream>

#include <cstring>

  

#include "iodos.h"

using namespace std;

 

 

void main()

    {

    dos_console();

    fstream f ("testfil2.txt", ios::in|ios::out|ios::trunc);

    //skriver två rader till filen

    f << "Detta är första raden " << endl;

    int pos2 = f.tellp();//här börjar rad 2

    f<< "Rad nummer 2" << endl;

    //skriv ut filen på skärmen

    f.seekp(0);

    char s[100];

    while(f.getline(s,100))

        cout << s << endl;

    f.clear();//nödvändigt efter filslut

    //ändra det första ordet till stjärnor

      

    f.seekp(0);

    for(int i =1; i <5; i++)

        f.put('*');

    //skriv ett X mitt på andra raden

    f.seekp(pos2);

    f.getline(s, 100);

    f.seekp(pos2+strlen(s)/2);

    f<<'X';

    //skriv ut filen  på skärmen

    f.seekp(0);

    cout << f.rdbuf();

    

    }